<?php

namespace JLPay\Models\Trans\Refunds;

use JLPay\Models\BaseResponse;

/**
 * 退款查询响应模型
 */
class RefundsQueryResponse extends BaseResponse
{
    /**
     * @var string|null 状态 1：待确认 2：成功 3：失败
     */
    protected ?string $status = null;

    /**
     * @var string|null 商户号
     */
    protected ?string $mchId = null;

    /**
     * @var string|null 平台订单号
     */
    protected ?string $transactionId = null;

    /**
     * @var string|null 外部订单号
     */
    protected ?string $outTradeNo = null;

    /**
     * @var string|null 渠道订单号
     */
    protected ?string $chnTransactionId = null;

    /**
     * @var string|null 原外部订单号
     */
    protected ?string $oriOutTradeNo = null;

    /**
     * @var string|null 原平台订单号
     */
    protected ?string $oriTransactionId = null;

    /**
     * @var string|null 交易时间
     */
    protected ?string $transTime = null;

    /**
     * @var string|null 退款完成时间
     */
    protected ?string $successTime = null;

    /**
     * 构造函数
     *
     * @param array|null $responseArray 响应数组
     */
    public function __construct(?array $responseArray = null)
    {
        parent::__construct($responseArray);

        if ($responseArray) {
            $this->status = $responseArray['status'] ?? null;
            $this->mchId = $responseArray['mch_id'] ?? null;
            $this->transactionId = $responseArray['transaction_id'] ?? null;
            $this->outTradeNo = $responseArray['out_trade_no'] ?? null;
            $this->chnTransactionId = $responseArray['chn_transaction_id'] ?? null;
            $this->oriOutTradeNo = $responseArray['ori_out_trade_no'] ?? null;
            $this->oriTransactionId = $responseArray['ori_transaction_id'] ?? null;
            $this->transTime = $responseArray['trans_time'] ?? null;
            $this->successTime = $responseArray['success_time'] ?? null;
        }
    }

    /**
     * 设置状态
     *
     * @param string $status 状态
     * @return $this
     */
    public function setStatus(string $status): self
    {
        $this->status = $status;
        return $this;
    }

    /**
     * 获取状态
     *
     * @return string|null 状态
     */
    public function getStatus(): ?string
    {
        return $this->status;
    }

    /**
     * 设置商户号
     *
     * @param string $mchId 商户号
     * @return $this
     */
    public function setMchId(string $mchId): self
    {
        $this->mchId = $mchId;
        return $this;
    }

    /**
     * 获取商户号
     *
     * @return string|null 商户号
     */
    public function getMchId(): ?string
    {
        return $this->mchId;
    }

    /**
     * 设置平台订单号
     *
     * @param string $transactionId 平台订单号
     * @return $this
     */
    public function setTransactionId(string $transactionId): self
    {
        $this->transactionId = $transactionId;
        return $this;
    }

    /**
     * 获取平台订单号
     *
     * @return string|null 平台订单号
     */
    public function getTransactionId(): ?string
    {
        return $this->transactionId;
    }

    /**
     * 设置外部订单号
     *
     * @param string $outTradeNo 外部订单号
     * @return $this
     */
    public function setOutTradeNo(string $outTradeNo): self
    {
        $this->outTradeNo = $outTradeNo;
        return $this;
    }

    /**
     * 获取外部订单号
     *
     * @return string|null 外部订单号
     */
    public function getOutTradeNo(): ?string
    {
        return $this->outTradeNo;
    }

    /**
     * 设置渠道订单号
     *
     * @param string $chnTransactionId 渠道订单号
     * @return $this
     */
    public function setChnTransactionId(string $chnTransactionId): self
    {
        $this->chnTransactionId = $chnTransactionId;
        return $this;
    }

    /**
     * 获取渠道订单号
     *
     * @return string|null 渠道订单号
     */
    public function getChnTransactionId(): ?string
    {
        return $this->chnTransactionId;
    }

    /**
     * 设置原外部订单号
     *
     * @param string $oriOutTradeNo 原外部订单号
     * @return $this
     */
    public function setOriOutTradeNo(string $oriOutTradeNo): self
    {
        $this->oriOutTradeNo = $oriOutTradeNo;
        return $this;
    }

    /**
     * 获取原外部订单号
     *
     * @return string|null 原外部订单号
     */
    public function getOriOutTradeNo(): ?string
    {
        return $this->oriOutTradeNo;
    }

    /**
     * 设置原平台订单号
     *
     * @param string $oriTransactionId 原平台订单号
     * @return $this
     */
    public function setOriTransactionId(string $oriTransactionId): self
    {
        $this->oriTransactionId = $oriTransactionId;
        return $this;
    }

    /**
     * 获取原平台订单号
     *
     * @return string|null 原平台订单号
     */
    public function getOriTransactionId(): ?string
    {
        return $this->oriTransactionId;
    }

    /**
     * 设置交易时间
     *
     * @param string $transTime 交易时间
     * @return $this
     */
    public function setTransTime(string $transTime): self
    {
        $this->transTime = $transTime;
        return $this;
    }

    /**
     * 获取交易时间
     *
     * @return string|null 交易时间
     */
    public function getTransTime(): ?string
    {
        return $this->transTime;
    }

    /**
     * 设置退款完成时间
     *
     * @param string $successTime 退款完成时间
     * @return $this
     */
    public function setSuccessTime(string $successTime): self
    {
        $this->successTime = $successTime;
        return $this;
    }

    /**
     * 获取退款完成时间
     *
     * @return string|null 退款完成时间
     */
    public function getSuccessTime(): ?string
    {
        return $this->successTime;
    }

    /**
     * 转换为数组格式
     *
     * @return array 数组格式的数据
     */
    public function toArray(): array
    {
        $data = parent::toArray();
        $data = array_merge($data, [
            'status' => $this->status,
            'mch_id' => $this->mchId,
            'transaction_id' => $this->transactionId,
            'out_trade_no' => $this->outTradeNo,
            'chn_transaction_id' => $this->chnTransactionId,
            'ori_out_trade_no' => $this->oriOutTradeNo,
            'ori_transaction_id' => $this->oriTransactionId,
            'trans_time' => $this->transTime,
            'success_time' => $this->successTime
        ]);

        return $data;
    }
} 